package com.yf.springboot.config;

import com.yf.springboot.bean.Car;
import com.yf.springboot.bean.Employer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

//配置绑定方式二: @Component + @EnableConfigurationProperties
//@EnableConfigurationProperties(Employer.class) // 1.向IOC注册Employer; 2.开启配置绑定
//springboot中不推荐使用这种老的xml方式注入bean，改用配置类,详见AppConfig
@ImportResource(locations = {"classpath:beans.xml"})
@ConditionalOnBean(name = "appConfig") // 也可以用在配置类上，满足条件配置类才生效
@Configuration(proxyBeanMethods = false)
//这种方式注册的组件在容器中的名字是类的FQDN名
@Import({Employer.class, Car.class})
/*
配置类本身也是一个组件
默认情况下为配置类中注册的组件都是单例（默认proxyBeanMethods = true）
从5.2开始配置类有两种模式：full(proxyBeanMethods = true), lite(proxyBeanMethods = false)
full模式下，配置类中所有实例都是单例，lite模式为多例。
lite模式不检查容器中是否已存在实例，效率更高，但如果容器中实例有依赖关系就只能用full模式，因为lite模式获取的实例都是重新创建的
 */
public class AppConfig {

    @ConditionalOnMissingBean(type = "com.yf.springboot.bean.Car") // 类型须指定FQDN名
    @Bean // @Bean用于向IOC容器中注入组件，组件名为方法名，组件类型为方法返回值类型，返回值就是组件在容器中的实例。
    // 也可以使用@Bean("car1")为组件实例指定名称
    public Car car() {
        return new Car("MAGOTAN", "1.8T");
    }

    /*@ConditionalOnBean(name = "car") // 条件装配，当容器中有组件car时才注册employer组件
    @Bean
    public Employer employer() {
        return new Employer();
    }*/

}
